package pe.gob.servir.apps.censodirectivo.ejb.service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;
import org.jboss.ejb3.annotation.Clustered;

import pe.gob.servir.apps.censodirectivo.common.constantes.Constantes;
import pe.gob.servir.apps.censodirectivo.ejb.dao.ConsumirProcedimientoDAOLocal;
import pe.gob.servir.apps.censodirectivo.ejb.dao.ResponsableDAOLocal;
import pe.gob.servir.apps.censodirectivo.ejb.dao.ResponsableTemporalDAOLocal;
import pe.gob.servir.apps.censodirectivo.excepcion.DAOExcepcion;
import pe.gob.servir.apps.censodirectivo.excepcion.ServiceExcepcion;
import pe.gob.servir.apps.censodirectivo.model.bean.BusquedaResponsable;
import pe.gob.servir.apps.censodirectivo.model.bean.Entidad;
import pe.gob.servir.apps.censodirectivo.model.bean.MensajeRespuesta;
import pe.gob.servir.apps.censodirectivo.model.bean.Persona;
import pe.gob.servir.apps.censodirectivo.model.bean.Responsable;
import pe.gob.servir.apps.censodirectivo.persistence.entity.TblResponsable;

/**
 * Session Bean implementation class ResponsableService
 */
@Stateless
@Clustered
public class ResponsableService implements ResponsableServiceRemote,ResponsableServiceLocal {

	private static final Logger log = Logger.getLogger(ResponsableService.class);
	
	@EJB
	private CensoServiceLocal censoServiceLocal;
	
	@EJB
	private ResponsableDAOLocal responsableDAOLocal;

	@EJB
	private ConsumirProcedimientoDAOLocal consumirProcedimientoDAOLocal;
	
	@EJB
	private ResponsableTemporalDAOLocal responsableTemporalDAOLocal;
	
	@EJB
	private UtilServiceLocal utilServiceLocal;

	public ResponsableService() {

	}
	
	@Override
	public MensajeRespuesta grabarResponsable(Responsable responsable) throws ServiceExcepcion {
		log.info("EJB ResponsableService - grabarResponsable");
		MensajeRespuesta mensajeRespuesta = null;
		try {
		 mensajeRespuesta = responsableDAOLocal.insertarResponsable(responsable);
		} catch(DAOExcepcion dEx) {
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}
	
	@Override
	public MensajeRespuesta ampliarRegistroDirectivo(Responsable responsable, BusquedaResponsable busquedaResponsable, String tipoAmpliacion) throws ServiceExcepcion {
		log.info("EJB ResponsableService - ampliarRegistroDirectivo");
		MensajeRespuesta mensajeRespuesta = null;
		try {
		 mensajeRespuesta = responsableDAOLocal.ampliarRegistroDirectivo(responsable,busquedaResponsable,tipoAmpliacion);
		} catch(DAOExcepcion dEx) {
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}
	
	@Override
	public MensajeRespuesta habilitarResponsables(Responsable responsable, BusquedaResponsable busquedaResponsable) throws ServiceExcepcion {
		log.info("EJB ResponsableService - ampliarRegistroDirectivo");
		MensajeRespuesta mensajeRespuesta = null;
		try {
		 mensajeRespuesta = responsableDAOLocal.habilitarResponsables(responsable,busquedaResponsable);
		} catch(DAOExcepcion dEx) {
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}
	
	@Override
	public MensajeRespuesta activarInactivarResponsable(long idResponsable, String tipo) throws ServiceExcepcion {
		log.info("EJB ResponsableService - activarInactivarResponsable");
		MensajeRespuesta mensajeRespuesta = null;
		try {
		 mensajeRespuesta = responsableDAOLocal.activarInactivarResponsable(idResponsable,tipo);
		} catch(DAOExcepcion dEx) {
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}
	
	@Override
	public void eliminar(Responsable responsable) {
		log.info("ResponsableService - eliminar");
		TblResponsable tblResponsable = responsableDAOLocal.buscarPorId(responsable.getResponsableId());
		responsableDAOLocal.eliminar(tblResponsable);
	}

	@Override
	public Responsable obtenerPorId(Long id) throws ServiceExcepcion {
		Responsable responsable = new Responsable();
		
		try {
			log.info("ResponsableService - obtenerPorId");
			responsable = responsableDAOLocal.buscarResponsableId(id);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return responsable;
	}

	@Override
	public List<Responsable> filtrarListaResponsable(BusquedaResponsable busquedaResponsable) throws ServiceExcepcion {
		log.info("ResponsableService - filtrarListaResponsable");
		List<Responsable> listaResponsables = null;
		try {
			listaResponsables = responsableDAOLocal.filtrarListaResponsable(busquedaResponsable);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return listaResponsables;
	}
	
	@Override
	public List<Responsable> validarCargaResponsable(String idCarga, String usuario) throws ServiceExcepcion {
		log.info("ResponsableService - validarCargaResponsable");
		List<Responsable> listaResponsables = null;
		try {
			 listaResponsables = responsableDAOLocal.validarCargaResponsable(idCarga, usuario);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return listaResponsables;
	}

	@Override
	public MensajeRespuesta registrarCargaMasiva(String cargarId, List<Responsable> listaResponsables) throws ServiceExcepcion {
		log.info("ResponsableService - registrarCargaMasiva");
		MensajeRespuesta mensajeRespuesta = null;
		try {
			List<Responsable> listaResponbleReniec = new ArrayList<Responsable>();
			for (Responsable responsable : listaResponsables) {
				// Valida datos con RENIEC
				String existeReniec = Constantes.NO_EXISTE_RENIEC;
				Persona persona = utilServiceLocal.obtenerDatosPersona(responsable.getDni());
				if (persona.getDni() != null && !persona.getDni().isEmpty()) {
					existeReniec = Constantes.SI_EXISTE_RENIEC;
				}
				responsable.setPersonaId(persona.getPersonaId());
				responsable.setNombresReniec(persona.getNombres());
				responsable.setApePaternoReniec(persona.getApellidoPaterno());
				responsable.setApeMaternoReniec(persona.getApellidoMaterno());
				responsable.setApellidoCasado(persona.getApellidoCasado());
				responsable.setDireccion(persona.getDireccion());
				responsable.setUbgDepartamento(persona.getUbgDepartamento());
				responsable.setUbgProvincia(persona.getUbgProvincia());
				responsable.setUbgDistrito(persona.getUbgDistrito());
				responsable.setSexo(persona.getSexo());
				responsable.setEstadoCivil(persona.getEstadoCivil());
				responsable.setFechaFallecimiento(responsable.getFechaFallecimiento());
				responsable.setFechaNacimiento(persona.getFechaNacimiento());
				responsable.setExisteReniec(existeReniec);
				responsable.setNomMadre(persona.getNomMadre());
				responsable.setNomPadre(persona.getNomPadre());
				responsable.setFechaCaducidad(persona.getFechaCaducidad());

				//Valida datos con SUNAT
				Entidad entidad = utilServiceLocal.obtenerDatosEntidad(responsable.getTipoEntidad(), responsable.getRucEntidad(), responsable.getNombreEntidad(), false);
				
				if (entidad == null){
					log.info("Entidad es null");
					responsable.setExisteSunat(Constantes.NO_EXISTE_SUNAT);
				}else{
					if (entidad.getNumeroRUC() != null && !entidad.getNumeroRUC().isEmpty() && entidad.getNumeroRUC().length() == 11) {
						log.info("++++++++ Entidad si existe en SUNAT o BD ++++++++");
						responsable.setExisteSunat(Constantes.SI_EXISTE_SUNAT);
						entidad.setTipoEntidad(responsable.getTipoEntidad());
					}else{
						log.info(" ++++++++ Entidad no existe en SUNAT o BD ++++++++");
						responsable.setExisteSunat(Constantes.NO_EXISTE_SUNAT);
						//Por validar lo puso Alina --
						entidad.setTipoEntidad(responsable.getTipoEntidad());
						entidad.setNombreEntidad(responsable.getNombreEntidad());
						entidad.setNombreEntidadSunat(responsable.getNombreEntidad());
						//--
					}
					
					responsable.setEntidad(entidad);
				}
				log.info("################ Solo Pruebas ################ " + entidad.getTipoEntidad() );
				log.info("################ Solo Pruebas ################ " + entidad.getNombreEntidad() );
				log.info("################ Solo Pruebas ################ " + entidad.getNombreEntidadSunat() );
				listaResponbleReniec.add(responsable);
				try {
				    Thread.sleep(2000);                 //1000 milliseconds is one second.
				} catch(InterruptedException ex) {
				    Thread.currentThread().interrupt();
				}
			}

			mensajeRespuesta = responsableTemporalDAOLocal.insertarCargaMasivaResponsable(cargarId, listaResponbleReniec);
		} catch(DAOExcepcion dEx) {
			log.error("ERROR: DAOExcepcion " , dEx);
			mensajeRespuesta = new MensajeRespuesta(dEx.getCodigoError(), dEx.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return mensajeRespuesta;
	}

	@Override
	public List<Responsable> listarResponsablesError(String cargaId,
			String usuario, long personaId) throws ServiceExcepcion {
		
		List<Responsable> listaResponsableTemporal = null;
		try {
			listaResponsableTemporal = responsableTemporalDAOLocal.listaResponsableTemporal(cargaId, usuario, personaId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		return listaResponsableTemporal;
	}
	
	private String obtenerMensajeError(final String codigo){
		 String mensajeError = consumirProcedimientoDAOLocal.consultarMensaje(codigo);
		return mensajeError;
	}
	
	@Override
	public List<Responsable> buscarReponsableEntidadCenso(Integer censoId,Integer entidadId)
			throws ServiceExcepcion {
		
		List<Responsable> listaResponsable = null;
		try {
			listaResponsable = responsableDAOLocal.buscarReponsableEntidadCenso(censoId,entidadId);
		} catch (DAOExcepcion e) {
			throw new ServiceExcepcion(e.getCodigoError(), e.getMensajeError());
		} catch (Exception e) {
			log.error("ERROR: ServiceExcepcion " , e);
			throw new ServiceExcepcion(Constantes.CODIGO_MSJ_ERROR_NEGOCIO, obtenerMensajeError(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}
		 
		return listaResponsable;
	}

	@Override
	public MensajeRespuesta actualizaResponsable(Responsable responsable)
			throws ServiceExcepcion {
		MensajeRespuesta mensajeRespuesta = null;
		log.info("actualizaDirectivoPublico - Parametros de entrada : " + responsable.toString());
		try {
			
			TblResponsable tblResponsable = new TblResponsable();
			Responsable obResponsable = new Responsable();
			obResponsable = obtenerPorId(responsable.getResponsableId());
			
			tblResponsable.setResponsableId(responsable.getResponsableId());
			tblResponsable.setEstadoRegistro(responsable.getEstadoRegistro());
			tblResponsable.setFechaModificacion(responsable.getFechaModificacion());
			tblResponsable.setUsuarioModificador(responsable.getUsuarioModificador());
			
			tblResponsable.setPersonaId(BigDecimal.valueOf(obResponsable.getPersonaId()));
			tblResponsable.setFechaInicioHabilitacion(obResponsable.getFechaInicioHabilitacion());
			tblResponsable.setFechaFinHabilitacion(obResponsable.getFechaFinHabilitacion());
			tblResponsable.setNumeroDiaHabilitacionExt(BigDecimal.valueOf(obResponsable.getNumeroDiaHabilitacionExt()));
			tblResponsable.setFechaFinHabilitacionExt(obResponsable.getFechaFinHabilitacionExt());
			tblResponsable.setCargo(obResponsable.getCargo());
			tblResponsable.setTitularEntidad(obResponsable.getTitularEntidad());
			tblResponsable.setTipoCarga(obResponsable.getTipoCarga());
			tblResponsable.setIdEntidad(BigDecimal.valueOf(obResponsable.getEntidad().getIdEntidad()));
			tblResponsable.setFechaCreacion(obResponsable.getFechaCreacion());
			tblResponsable.setUsuarioCreador(obResponsable.getUsuarioCreador());
			tblResponsable.setCensoId(obResponsable.getCenso().getCensoId());
			tblResponsable.setEstadoResponsableId(BigDecimal.valueOf(obResponsable.getEstadoResponsableId()));
			
			responsableDAOLocal.actualizar(tblResponsable);
			mensajeRespuesta = new MensajeRespuesta(
					Constantes.CODIGO_MSJ_EXITO,
					consumirProcedimientoDAOLocal
							.consultarMensaje(Constantes.CODIGO_MSJ_EXITO));
	
		} catch (Exception e) {
			throw new ServiceExcepcion(
					Constantes.CODIGO_MSJ_ERROR_NEGOCIO,
					consumirProcedimientoDAOLocal
							.consultarMensaje(Constantes.CODIGO_MSJ_ERROR_NEGOCIO));
		}

		return mensajeRespuesta;

	}

}
